package aOrganizar;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

import excepciones.ReservarException;

public class ReservaManager
{	

	private static ReservaManager  instance;
	private  Collection<Reserva>   reservas;
	
	static
	{
		instance = new ReservaManager();		
	}
	
	private ReservaManager()
	{
		reservas = new HashSet<Reserva>();
	}

	public static ReservaManager getInstance()
	{
		return instance;
	}
	
	//Reserva un asiento.
	public Reserva reservar(Asiento asiento,Usuario usuario)
	{
		//Indica si este asiento ya ha sido reservado.
		boolean sobre_reserva = false;
		
		//Intento reservar el asiento.
		try
		{
			asiento.reservar();			
		}
		catch(ReservarException excep)
		{
			sobre_reserva  = true;
		}
		
		//Si se pudo reservar, agrego el asiento a la coleccion de asientos.
		Reserva reserva = new Reserva(asiento,usuario,sobre_reserva);
		
		reservas.add(reserva);
		
		return reserva;
	}
	
	//Numero de reservas.
	public int numReservas()
	{		
		return (reservas.size());		
	}
	
	public Collection<Reserva> getReservas()
	{
		return this.reservas;		
	}
	
	//Devuelve una coleccion con todas las reservas de un usuario.
	public Collection<Asiento> reservas_usuario(Usuario usuario)
	{
		Collection<Asiento>  asientos = new  HashSet<Asiento>();	
		
		//Itero toda la coleccion.
		for (Reserva tmpReserva : this.reservas)
		{
			//Filtro por usuario, no funcionaba con equals.
			if (tmpReserva.getUsuario().getApellido()==usuario.getApellido()&&
				tmpReserva.getUsuario().getNombre()==usuario.getNombre()&&
				tmpReserva.getUsuario().getDni()==usuario.getDni())
			{
				asientos.add(tmpReserva.getAsiento());
			}
		}	
		
		return asientos;
	}
	
	//Usado para pruebas, ver el contenido de una coleccion.
	public void ver_reservas(Collection<Reserva> param_reservas)
	{		
		for (Reserva tmpReserva : param_reservas)
		{
			System.out.println("--");
			System.out.println(tmpReserva.getAsiento().getVuelo().getCodigo());
			System.out.println(tmpReserva.getAsiento().getVuelo().getSalida());
			System.out.println(tmpReserva.getAsiento().getNumeroDeAsiento());
			System.out.println(tmpReserva.getUsuario().getNombre());
			System.out.println(tmpReserva.getUsuario().getApellido());
			System.out.println(tmpReserva.getUsuario().getDni());		
		}
		
		System.out.println(param_reservas.size());
	}
	
	public Reserva buscar_reserva(Reserva reserva)
	{
		Reserva resu = null;
		
		for (Reserva tmp_reserva :this.reservas)
		{
				if (tmp_reserva==reserva)
				{
					resu = tmp_reserva;
					break;
				}
		}
		
		return resu;
	}
	
	public void borrar_reserva(Reserva reserv)
	{
		//Busco las sobrereservas del asiento que se compro.
		for (Reserva reserva : this.reservas)
		{	
				if (reserva==reserv)
				{
					reservas.remove(reserva);
					break;
				}
		}		
	}	
	
	//Este metodo transfiera la reserva.
	public Reserva tranferir_reserva(Asiento asiento)
	{
		ArrayList<Reserva> reservasaux = new ArrayList<Reserva>();
		
		//Busco las sobrereservas del asiento que se libero.
		for (Reserva tmp_asiento : reservas)
		{
				//Verifico que se trate del mismo asiento.
				if (tmp_asiento.getAsiento()==asiento)
				{
					reservasaux.add(tmp_asiento);
				}
		}
		
		//Si hay alguna sobrereserva, le hago la reserva al primero.
		if (reservasaux.size()>0)
		{	
			//Obtengo el primero.
			Reserva resultado = reservasaux.get(0);
			
			//Hago la reserva en la Aerolinea, como ya fue liberada no deberia fallar.
			this.reservar(resultado.getAsiento(),resultado.getUsuario());
			
			Reserva resu = this.buscar_reserva(resultado);
			resu.setSobreReserv(false);
			
			return resultado; 
		}
		
		return null;
	}
	
	public void limpiar_reservas()
	{
		this.reservas.clear();		
	}

}
